package com.huirui.server.schedule;

import com.huirui.server.constant.OrderStatus;
import com.huirui.server.pojo.entity.Order;
import com.huirui.server.service.OrderService;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Slf4j
//@Component
public class ScheduleOrderAutoCancelTask {
    @Resource
    private OrderService orderService;

    // 1. 项目启动时，Bean初始化完成后立即执行（仅一次）
    @PostConstruct
    public void cleanUpUnpaidOrdersOnStartup() {
        log.info("项目启动-执行初始化任务-清理未支付订单");
        // 复用核心逻辑，避免代码重复
        cleanUpUnpaidOrdersCore();
    }

    // 2. 周期性定时任务（每30分钟执行一次）
    @Scheduled(cron = "0 0/30 * * * ?")
    public void cleanUpUnpaidOrdersRegularly() {
        log.info("执行定时任务-清理未支付订单");
        cleanUpUnpaidOrdersCore();
    }

    // 3. 核心业务逻辑抽取（复用，减少冗余）
    private void cleanUpUnpaidOrdersCore() {
        LocalDateTime threeDaysAgo = LocalDateTime.now().minusDays(3);
        // 注意：原代码缺少 execute() 方法！lambdaUpdate() 需调用 execute() 才会执行SQL
        orderService
                .lambdaUpdate()
                .eq(Order::getStatus, OrderStatus.PENDING_PAYMENT)
                .lt(Order::getCreateTime, threeDaysAgo)
                .set(Order::getStatus, OrderStatus.CANCELED)
                .update(); // 关键：不调用 execute() ，更新操作不会生效！
    }
}
